/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.faces.model.SelectItem;

/**
 *
 * @author HNCR
 */
public class Producto implements Serializable {
    private String cod_producto;
    private String descripcion;
    private double precio;
    private int stock;
    private CategoriaProducto objCategoriaProducto=new CategoriaProducto();
    private String salida;
    private int estado;
    private String est;


    public Producto() {
    }

    public String getCod_producto() {
        return cod_producto;
    }

    public void setCod_producto(String cod_producto) {
        this.cod_producto = cod_producto;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public double getPrecio() {
        return precio;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public CategoriaProducto getObjCategoriaProducto() {
        return objCategoriaProducto;
    }

    public void setObjCategoriaProducto(CategoriaProducto objCategoriaProducto) {
        this.objCategoriaProducto = objCategoriaProducto;
    }

    public String getSalida() {
        return salida;
    }

    public void setSalida(String salida) {
        this.salida = salida;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public String getEst() {
        return est;
    }

    public void setEst(String est) {
        this.est = est;
    }

    
    
    //==========================================================================
    //-----registro
    public static boolean registrarProducto (Producto a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_producto_registro "
                     +"(?,?,?,?,?)} ");
             st.setString(1,a.getDescripcion());
             st.setDouble(2, a.getPrecio());
             st.setInt(3,a.getStock());
             st.setString(4,a.getObjCategoriaProducto().getCod_categoria());  
             st.registerOutParameter(5,java.sql.Types.VARCHAR);
             st.execute();
             a.setCod_producto(st.getString(5));
             if(!"EXISTE".equals(a.getCod_producto()))
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
        return estado;  
        
    }
    
    //---------buscar - listar
    public static ArrayList<Producto> getBuscarProducto(Producto producto){
     ArrayList<Producto> arreglo=null;
     ResultSet rs=null;
        Producto obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_producto_buscar(?)}");
            st.setString(1, producto.getDescripcion());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Producto>();   
                do{
                        obj =new Producto();                        
                        obj.setCod_producto(rs.getString("cod_producto"));
                        obj.setDescripcion(rs.getString("descripcion"));
                        obj.setPrecio(rs.getDouble("precio"));
                        obj.setStock(rs.getInt("stock"));
                        obj.getObjCategoriaProducto().setCod_categoria(rs.getString("cod_categoria"));
                        obj.getObjCategoriaProducto().setDescripcion(rs.getString("descripcion"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    //--------listar
    public static ArrayList<Producto> getListarProducto(){
     ArrayList<Producto> arreglo=null;
     ResultSet rs=null;
        Producto obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_producto_listar()}");
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Producto>();   
                do{
                        obj =new Producto();                        
                        obj.setCod_producto(rs.getString("cod_producto"));
                        obj.setDescripcion(rs.getString("descripcion"));
                        obj.setPrecio(rs.getDouble("precio"));
                        obj.setStock(rs.getInt("stock"));
                        obj.getObjCategoriaProducto().setCod_categoria(rs.getString("cod_categoria"));
                        obj.getObjCategoriaProducto().setDescripcion(rs.getString("cat"));
                        obj.setEstado(rs.getInt("estado"));
                        if(obj.getEstado()==1){
                            obj.setEst("ACTIVO");
                        }else{
                            obj.setEst("INACTIVO");
                        } 
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    //---------buscar - listar
    public static ArrayList<Producto> getListarProductoxCategoria(Producto producto){
     ArrayList<Producto> arreglo=null;
     ResultSet rs=null;
        Producto obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_producto_listar_x_categoria(?)}");
            st.setString(1, producto.getObjCategoriaProducto().getCod_categoria());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Producto>();   
                do{
                        obj =new Producto();                        
                        obj.setCod_producto(rs.getString("cod_producto"));
                        obj.setDescripcion(rs.getString("descripcion"));
                        obj.setPrecio(rs.getDouble("precio"));
                        obj.setStock(rs.getInt("stock"));
                        obj.getObjCategoriaProducto().setCod_categoria(rs.getString("cod_categoria"));
                        obj.getObjCategoriaProducto().setDescripcion(rs.getString("descripcion"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    /*
     * combo 
     */
    public ArrayList<SelectItem>getCargarComboProducto(){         
    ArrayList<SelectItem> arrayNivel = new ArrayList<SelectItem>();
    Connection conexion = null;
    ResultSet rs = null;
    try{
    conexion = ControladorBD.darConexionBD();
    CallableStatement st = conexion.prepareCall( "{CALL sp_producto_combo()}");    
    rs = st.executeQuery();        
    if (rs.next()){    
      do{
        arrayNivel.add(new SelectItem(rs.getString("cod_producto"), 
                rs.getString("descripcion")));              
      } while (rs.next());
    }  
         rs.close();
         st.close();
         conexion.close();

     }catch(Exception error){
        System.out.println("Error en el metodo por: " +
                   error.getMessage());
                error.printStackTrace();
        }    
      
    return arrayNivel;
    }
    
    
    //actualizar
     public static boolean actualizarProducto (Producto a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_producto_modificar "
                     +"(?,?,?,?,?,?)} ");
             st.setString(1,a.getCod_producto());
             st.setString(2,a.getDescripcion());
             st.setDouble(3,a.getPrecio());
             st.setInt(4,a.getStock());
             st.setString(5,a.getObjCategoriaProducto().getCod_categoria());  
             st.registerOutParameter(6,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(6));
             if(a.getSalida()!=null)
             {
                 estado=true;
             }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
     
     //eliminar
     public static boolean eliminarProducto (Producto a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_producto_eliminar "
                     +"(?,?)} ");
             st.setString(1,a.getCod_producto());
             st.registerOutParameter(2,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(2));
             if(a.getSalida()!=null)
             {
                 estado=true;
             }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
    
}
